﻿using System;

namespace System.Collections.Generic
{
    /// <summary>
    /// 定义了一种只读的，可以获取大小以及使用整形索引的集合接口
    /// </summary>
    public interface IReadOnlyCollection<T> : IEnumerable<T>
    {
        /// <summary>
        /// 获取 集合中包含的元素数。
        /// </summary>
        int Count { get; }

        /// <summary>
        /// 确定 集合是否包含特定值。
        /// </summary>
        /// <param name="item">要在集合中定位的对象。</param>
        /// <returns>如果在集合中找到 item，则为 true；否则为 false。</returns>
        bool Contains(T item);
        
        /// <summary>
        /// 确定集合中特定项的索引。
        /// </summary>
        /// <param name="item">要在集合中定位的对象。</param>
        /// <returns>如果在列表中找到，则为 item 的索引；否则为 -1。</returns>
        int IndexOf(T item);

        /// <summary>
        /// 从特定的 System.Array 索引处开始，将集合的元素复制到一个 System.Array 中。
        /// </summary>
        /// <param name="array">作为从集合复制的元素的目标位置的一维 System.Array。System.Array必须具有从零开始的索引。</param>
        /// <param name="arrayIndex">array 中从零开始的索引，将在此处开始复制。</param>
        /// <exception cref="System.ArgumentNullException">array 为 null。</exception>
        /// <exception cref="System.ArgumentOutOfRangeException">arrayIndex 小于 0。</exception>
        /// <exception cref="System.ArgumentException">
        /// array 是多维数组。
        /// - 或 -源集合中的元素数大于从 arrayIndex 到目标 array 结尾处之间的可用空间。
        /// - 或 -无法自动将类型 T 强制转换为目标 array 的类型。
        /// </exception>
        void CopyTo(T[] array, int arrayIndex);

        /// <summary>
        /// 获取指定索引处的元素。
        /// </summary>
        /// <param name="index">要获得的元素从零开始的索引。</param>
        /// <returns>指定索引处的元素。</returns>
        /// <exception cref="System.ArgumentOutOfRangeException">index 不是 集合中的有效索引。</exception>
        T this[int index] { get; }

    }
}
